The approaches described in this section could be pursued, but are not necessarily approaches that have been previously conceived or pursued. Therefore, unless otherwise indicated herein, the approaches described in this section are not prior art to the claims in this application and are not admitted to be prior art by inclusion in this section.
Data networks use transport-layer protocols to regulate the movement of data packets among network elements. In the standards-based internetworks known as the Internet, Transmission Control Protocol (“TCP”) is a foundational protocol that provides transport-layer services. TCP is defined in Internet Engineering Task Force (IETF) Request for Comments (RFC) 793. A software implementation of TCP is often known as a TCP stack. A TCP stack may be implemented in a router, switch, or other element of network infrastructure, or in a personal computer, server, workstation, or other end station device. The term “host” encompasses both network elements and end station devices. Two devices that have respective TCP stacks and communicate according to TCP are often called TCP peers or peer hosts. The basic unit of communication under TCP is a segment, which is encapsulated in an Internet Protocol (IP) packet when IP is the network layer protocol.
Data communication protocols often provide a way for a receiving host to signal a sending host that the receiving host cannot accept more data, for example, because receiving buffers of the receiving host are full. To provide such signaling, TCP defines a segment attribute termed the window size. When a receiving host receives a data segment but cannot accept further data thereafter, the receiving host sends an acknowledgment TCP segment (“ACK segment”) that contains a window size value of zero. A sending host, upon receiving a window size value of zero, understands that the receiver cannot accept more data, and must not send any more data.
However, the sending host needs a way to determine, subsequently, when the receiving host is again ready to receive data. In one approach, a sending host sends a probe segment that contains one byte of additional data. The purpose of the probe segment is to induce the receiving host to send back another ACK segment that contains an updated window size value. If the receiving host truly cannot accept more data, then the one byte of data in the probe segment may be lost, and re-transmission will be required. Moreover, sending even one byte of data when the receiving host has advertised a window size of zero is a technical violation of the protocol, because a window size of zero means “send nothing.”
Further, if the receiving host can accept exactly one byte, then the transmission may be successful, but such transmission is highly inefficient and results in a great degree of fragmentation of a larger data payload. In certain applications, avoiding fragmentation is desirable. For example, an application such as BGP running on top of TCP may have policy that requires BGP to send only complete protocol data units (PDUs) to counterpart peer processes. For these applications, policy dictates that a sending host should send data only when it can do so efficiently, for example, by sending a data segment that contains a specified minimum number of bytes, such as a complete PDU.
Based on the foregoing, there is a clear need in the field for an improved technique of determining when a window size has changed to a value other than zero. There is a particular need for a technique that can achieve such a determination without sending fragmented data.